/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package estructurassa.controladores.ABMTrabajador;

import estructurassa.controladores.Controlador;
import estructurassa.controladores.ControladorPrincipal;
import estructurassa.controladores.FabricaControladores;
import estructurassa.entidades.CategoriaTrabajador;
import estructurassa.entidades.Trabajador;
import estructurassa.expertos.ExpertoABMTrabajador;
import estructurassa.expertos.FabricaExpertos;
import estructurassa.expertos.excepciones.ABMTrabajadorException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Iterator;
import java.util.List;
import javax.swing.JInternalFrame;
import javax.swing.JOptionPane;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import persistencia.exceptions.ExcepcionFachada;

/**
 *
 * @author Juan
 */
public class ControladorABMTrabajador implements Controlador {

    PantallaABMTrabajador pantalla;
    PantallaTrabajadorJDialog pantallaTrabajadorJDialog = new PantallaTrabajadorJDialog(null, true);
    PantallaCategoriaJDialog pantallaCategoriaJDialog = new PantallaCategoriaJDialog(null, true);
    ExpertoABMTrabajador experto;
    Trabajador trabajadorSeleccionado;
    CategoriaTrabajador categoriaSeleccionada;
    ModeloTablaTrabajador modeloTablaTrabajadores = new ModeloTablaTrabajador();
    ModeloTablaCategorias modeloTablaCategorias = new ModeloTablaCategorias();
    boolean iniciado;

    public ControladorABMTrabajador() {
        pantalla = new PantallaABMTrabajador();
        experto = (ExpertoABMTrabajador) FabricaExpertos.getInstancia().getExperto(FabricaExpertos.expertos.ABM_TRABAJADOR);

        pantalla.getTablaTrabajadores().setModel(modeloTablaTrabajadores);
        pantalla.getTablaTrabajadores().setAutoCreateRowSorter(true);
        pantalla.getTablaTrabajadores().getSelectionModel().addListSelectionListener(new ListSelectionListener() {

            @Override
            public void valueChanged(ListSelectionEvent e) {
                seleccionarTrabajador();
            }
        });

        pantallaCategoriaJDialog.getTablaCategorias().getSelectionModel().addListSelectionListener(new ListSelectionListener() {

            @Override
            public void valueChanged(ListSelectionEvent e) {
                seleccionarCategoria();
            }
        });

        /**
         * ################################################################
         * ################################################################
         * Barra herramientas
         * ################################################################
         * ################################################################
         */
        agregarAccionesABotones();


    }

    @Override
    public JInternalFrame getPantalla() {
        return pantalla;
    }

    @Override
    public void iniciar() {
        if (!iniciado) {
            ((ControladorPrincipal) FabricaControladores.getInstance().getControlador(FabricaControladores.controladoresNombre.PRINCIPAL)).agregarPantallaInterna(pantalla);
            iniciado = true;
        } else {
            pantalla.toFront();
            pantalla.setVisible(true);
        }

        ((ModeloTablaTrabajador) pantalla.getTablaTrabajadores().getModel()).setListaElementos(experto.buscarTrabajador());
    }

    public void guardar() {
        if (trabajadorSeleccionado == null) {
            trabajadorSeleccionado = new Trabajador();
        }
        trabajadorSeleccionado.setNombre(pantallaTrabajadorJDialog.getTextoNombre().getText());
        trabajadorSeleccionado.setApellido(pantallaTrabajadorJDialog.getTextoApellido().getText());
        trabajadorSeleccionado.setLegajo(Integer.parseInt(pantallaTrabajadorJDialog.getTextoLegajo().getText()));
        trabajadorSeleccionado.setDni(pantallaTrabajadorJDialog.getTextoDocumento().getText());
        trabajadorSeleccionado.setTipoDNI(pantallaTrabajadorJDialog.getTextoTipoDocumento().getText());
        trabajadorSeleccionado.setCategoria(categoriaSeleccionada);


        try {
            experto.guardar(trabajadorSeleccionado);
        } catch (ABMTrabajadorException ex) {
            JOptionPane.showMessageDialog(pantalla, ex.getMessage(), "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
            return;
        }
        JOptionPane.showMessageDialog(pantalla, "Trabajador Guardado Correctamente", "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
        agregarTrabajadorATabla(trabajadorSeleccionado);
        limpiarCampos();


    }

    public void modificar() {
        if (trabajadorSeleccionado == null) {
            trabajadorSeleccionado = new Trabajador();
        }
        trabajadorSeleccionado.setNombre(pantallaTrabajadorJDialog.getTextoNombre().getText());
        trabajadorSeleccionado.setApellido(pantallaTrabajadorJDialog.getTextoApellido().getText());
        trabajadorSeleccionado.setLegajo(Integer.parseInt(pantallaTrabajadorJDialog.getTextoLegajo().getText()));
        trabajadorSeleccionado.setDni(pantallaTrabajadorJDialog.getTextoDocumento().getText());
        trabajadorSeleccionado.setTipoDNI(pantallaTrabajadorJDialog.getTextoTipoDocumento().getText());
        trabajadorSeleccionado.setCategoria(categoriaSeleccionada);


        try {
            experto.modificar(trabajadorSeleccionado);
        } catch (ABMTrabajadorException ex) {
            JOptionPane.showMessageDialog(pantalla, ex.getMessage(), "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
            return;
        }
        JOptionPane.showMessageDialog(pantalla, "Trabajador Modificado Correctamente", "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
        agregarTrabajadorATabla(trabajadorSeleccionado);

    }

    private void limpiarCampos() {
        trabajadorSeleccionado = null;
        categoriaSeleccionada = null;
//        pantalla.limpiarCampos();
    }

    private void seleccionarTrabajador() {
        int fila = pantalla.getTablaTrabajadores().getSelectedRow();
        if (fila == -1) {
            return;
        }
        int filaModelo = pantalla.getTablaTrabajadores().convertRowIndexToModel(fila);
        trabajadorSeleccionado = (Trabajador) ((ModeloTablaTrabajador) pantalla.getTablaTrabajadores().getModel()).getRow(filaModelo);
        cargarDatosTrabajadorEnJDialog(trabajadorSeleccionado);
    }

    private void cargarDatosTrabajadorEnJDialog(Trabajador trabajador) {
        pantallaTrabajadorJDialog.getTextoApellido().setText(trabajadorSeleccionado.getApellido());
        pantallaTrabajadorJDialog.getTextoTipoDocumento().setText(trabajadorSeleccionado.getTipoDNI());
        pantallaTrabajadorJDialog.getTextoNombre().setText(trabajadorSeleccionado.getNombre());
        pantallaTrabajadorJDialog.getTextoLegajo().setText(trabajadorSeleccionado.getLegajo() + "");
        pantallaTrabajadorJDialog.getTextoDocumento().setText(trabajadorSeleccionado.getDni());

        pantallaTrabajadorJDialog.getTextoCategoria().setText(trabajadorSeleccionado.getCategoria().getDescripcion());
        categoriaSeleccionada = trabajadorSeleccionado.getCategoria();
    }

    private void agregarTrabajadorATabla(Trabajador trabajador) {
        List trabajadores = ((ModeloTablaTrabajador) pantalla.getTablaTrabajadores().getModel()).getListaElementos();
        for (Iterator it = trabajadores.iterator(); it.hasNext();) {
            Object trabajadorLista = it.next();
            if (trabajador.equals(trabajadorLista)) {
                ((ModeloTablaTrabajador) pantalla.getTablaTrabajadores().getModel()).fireTableDataChanged();
                return;
            }
        }
        ((ModeloTablaTrabajador) pantalla.getTablaTrabajadores().getModel()).addRow(trabajador);
    }

    private void quitarTrabajadorTabla(Trabajador trabajador) {
        List trabajadores = ((ModeloTablaTrabajador) pantalla.getTablaTrabajadores().getModel()).getListaElementos();
        for (Iterator it = trabajadores.iterator(); it.hasNext();) {
            Object materialLista = it.next();
            if (trabajador.equals(materialLista)) {
                ((ModeloTablaTrabajador) pantalla.getTablaTrabajadores().getModel()).getListaElementos().remove(trabajador);
                ((ModeloTablaTrabajador) pantalla.getTablaTrabajadores().getModel()).fireTableDataChanged();
                return;
            }
        }
    }

    private void darBaja() {
        if (trabajadorSeleccionado == null) {
            return;
        }
        int confirmado = JOptionPane.showConfirmDialog(
                pantalla,
                "¿Desea dar baja al material: " + trabajadorSeleccionado.getNombre() + "?");
        if (JOptionPane.OK_OPTION == confirmado) {
            try {
                experto.darDeBaja(trabajadorSeleccionado);
            } catch (ABMTrabajadorException ex) {
                JOptionPane.showMessageDialog(pantalla, ex.getMessage(), "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
                return;
            } catch (ExcepcionFachada ex) {
                JOptionPane.showMessageDialog(pantalla, ex.getMessage(), "ERROR", JOptionPane.ERROR_MESSAGE);
                return;
            }
            JOptionPane.showMessageDialog(pantalla, "El material seleccionado fue dado de baja correctamente", "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
            quitarTrabajadorTabla(trabajadorSeleccionado);
            limpiarCampos();
        }
    }

    private void salir() {
        pantalla.setVisible(false);
    }

    private void agregarAccionesABotones() {

        pantalla.getBtnNuevo().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                nuevoTrabajador();
            }
        });
        pantalla.getBtnModificar().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if (trabajadorSeleccionado != null) {
                    modificarTrabajador();
                }
            }
        });

        pantalla.getBtnSalir().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                salir();
            }
        });
        pantallaCategoriaJDialog.getBtnSalir().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                pantallaCategoriaJDialog.setVisible(false);
            }
        });
        pantallaTrabajadorJDialog.getBtnGuardar().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {

                if (pantallaTrabajadorJDialog.getTextoApellido().getText().length() > 0
                        && pantallaTrabajadorJDialog.getTextoCategoria().getText().length() > 0
                        && pantallaTrabajadorJDialog.getTextoDocumento().getText().length() > 0
                        && pantallaTrabajadorJDialog.getTextoLegajo().getText().length() > 0
                        && pantallaTrabajadorJDialog.getTextoNombre().getText().length() > 0
                        && pantallaTrabajadorJDialog.getTextoTipoDocumento().getText().length() > 0) {
                    if (trabajadorSeleccionado == null) {
                        guardar();
                    } else {
                        modificar();
                    }
                    limpiarPantallaTrabajadorJDialog();
                    pantallaTrabajadorJDialog.setVisible(false);
                }
            }
        });
        pantallaTrabajadorJDialog.getBotonBuscarCategoria().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                mostrarCategorias();
            }
        });

    }

    public void nuevoTrabajador() {
        limpiarPantallaTrabajadorJDialog();
        pantallaTrabajadorJDialog.setVisible(true);

    }

    public void mostrarCategorias() {
        modeloTablaCategorias.setListaElementos(experto.buscarCategoriaEmpleado());
        pantallaCategoriaJDialog.getTablaCategorias().setModel(modeloTablaCategorias);
        pantallaCategoriaJDialog.setVisible(true);
    }

    public void modificarTrabajador() {
        pantallaTrabajadorJDialog.setVisible(true);

        pantallaTrabajadorJDialog.getTextoApellido().setText(trabajadorSeleccionado.getApellido());
        pantallaTrabajadorJDialog.getTextoTipoDocumento().setText(trabajadorSeleccionado.getTipoDNI());
        pantallaTrabajadorJDialog.getTextoNombre().setText(trabajadorSeleccionado.getNombre());
        pantallaTrabajadorJDialog.getTextoLegajo().setText(trabajadorSeleccionado.getLegajo() + "");

        pantallaTrabajadorJDialog.getTextoCategoria().setText(trabajadorSeleccionado.getCategoria().getDescripcion());
        categoriaSeleccionada = trabajadorSeleccionado.getCategoria();
    }

    private void limpiarPantallaTrabajadorJDialog() {
        categoriaSeleccionada = null;
        pantallaTrabajadorJDialog.getTextoApellido().setText("");
        pantallaTrabajadorJDialog.getTextoTipoDocumento().setText("");
        pantallaTrabajadorJDialog.getTextoNombre().setText("");
        pantallaTrabajadorJDialog.getTextoLegajo().setText("");
        pantallaTrabajadorJDialog.getTextoDocumento().setText("");
        pantallaTrabajadorJDialog.getTextoCategoria().setText("");

    }

    private void seleccionarCategoria() {
        int fila = pantallaCategoriaJDialog.getTablaCategorias().getSelectedRow();
        if (fila == -1) {
            return;
        }
        int filaModelo = pantallaCategoriaJDialog.getTablaCategorias().convertRowIndexToModel(fila);
        categoriaSeleccionada = (CategoriaTrabajador) ((ModeloTablaCategorias) pantallaCategoriaJDialog.getTablaCategorias().getModel()).getRow(filaModelo);
        cargarDatosCategoria(categoriaSeleccionada);
    }

    private void cargarDatosCategoria(CategoriaTrabajador categoriaSeleccionada) {
        pantallaTrabajadorJDialog.getTextoCategoria().setText(categoriaSeleccionada.getNombre());
    }
}
